//The MIT License
//
//Copyright (c) <2011> <GEPAR - Grupo de Ensino e Pesquisa em Agroinformática e Rastreabilidade>
//
//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions:
//
//The above copyright notice and this permission notice shall be included in
//all copies or substantial portions of the Software.
//
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//THE SOFTWARE.

package gui;

import core.ConfigNovaTabul;
import core.EstatisticasTabul;
import core.Tabulacao;
import core.TabulacaoDAO;
import java.awt.Color;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

public class PanelNovaTabulacao extends javax.swing.JPanel {

    /**
     * JTabbedPane no qual este panel está contido.
     */
    JTabbedPane tabPai;

    /**
     * Tabulação que está sendo preenchida neste painel.
     */
    Tabulacao tabulacao;

    /**
     * Configuração da tabulação atual.
     */
    ConfigNovaTabul configTabul;

    /**
     * Construtor preparado para receber uma tabulação já pré-configurada.
     * @param novaTabul Uma configuração de tabulação.
     */
    public PanelNovaTabulacao(ConfigNovaTabul configTabul, JTabbedPane tabPai)
    {
        this.initComponents();

        this.tabPai = tabPai;
        this.tabulacao = new Tabulacao(configTabul);
        this.configTabul = configTabul;

        SimpleDateFormat formatData = new SimpleDateFormat("dd/MM/yyyy");
        this.lblTitulo.setText(configTabul.getNomeProd() + " - " + formatData.format(configTabul.getDataColeta()));

        this.lblEntreposto.setText("Entreposto: " + this.configTabul.getEntreposto());
        this.lblClassificacao.setText("Classificação: " + this.configTabul.getClassific());
        String textoQtdeCaixa = new DecimalFormat("##.##").format(this.configTabul.getQtdeCaixa());
        this.lblTipoCaixa.setText("Tipo de caixa: " + textoQtdeCaixa + " " +
                this.configTabul.getMetricaCaixa());
        this.lblResponsavelColeta.setText("Responsável(is) pela coleta: " + this.configTabul.getRespColeta());

        if (this.configTabul.getIdRespColeta2() != 1)
        {
            // há um segundo responsável pela coleta; adicionamos seu nome às informações de exibição
            this.lblResponsavelColeta.setText(this.lblResponsavelColeta.getText() + " / " +
                    this.configTabul.getRespColeta2());
        }

        this.configurarCabecalho();

        this.assumirEstadoInicial();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        lblTitulo = new javax.swing.JLabel();
        lblClassificacao = new javax.swing.JLabel();
        lblTipoCaixa = new javax.swing.JLabel();
        lblResponsavelColeta = new javax.swing.JLabel();
        lblStatusTabulacao = new javax.swing.JLabel();
        btnAdicionarPrecos = new javax.swing.JButton();
        btnFinalizarTabulacao = new javax.swing.JButton();
        scrollTabela = new javax.swing.JScrollPane();
        tblPrecosColetados = new javax.swing.JTable();
        lblAjudaTabela = new javax.swing.JLabel();
        btnTabularProxSemana = new javax.swing.JButton();
        btnTabularOutroProd = new javax.swing.JButton();
        btnDescartarTabulacao = new javax.swing.JButton();
        lblResultadosUni = new javax.swing.JLabel();
        lblPrecoMinUni = new javax.swing.JLabel();
        lblPrecoMaxUni = new javax.swing.JLabel();
        lblMediaUni = new javax.swing.JLabel();
        lblModaUni = new javax.swing.JLabel();
        lblMedianaUni = new javax.swing.JLabel();
        lblEntreposto = new javax.swing.JLabel();
        lblModaCaixa = new javax.swing.JLabel();
        lblMedianaCaixa = new javax.swing.JLabel();
        lblResultadosCaixa = new javax.swing.JLabel();
        lblPrecoMinCaixa = new javax.swing.JLabel();
        lblMediaCaixa = new javax.swing.JLabel();
        lblPrecoMaxCaixa = new javax.swing.JLabel();
        btnVoltarTelaInicial = new javax.swing.JButton();
        btnExcluirLinha = new javax.swing.JButton();
        lblErroSemLSelec = new javax.swing.JLabel();

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(jTable1);

        lblTitulo.setFont(new java.awt.Font("Tahoma", 1, 18));
        lblTitulo.setText("Produto - data da coleta");

        lblClassificacao.setText("Classificação:");

        lblTipoCaixa.setText("Tipo de caixa:");

        lblResponsavelColeta.setText("Responsável(is) pela coleta:");

        lblStatusTabulacao.setFont(new java.awt.Font("Ubuntu", 1, 16));
        lblStatusTabulacao.setForeground(new java.awt.Color(153, 153, 0));
        lblStatusTabulacao.setText("Esta tabulação está em andamento.");

        btnAdicionarPrecos.setText("Adicionar preços");
        btnAdicionarPrecos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAdicionarPrecosActionPerformed(evt);
            }
        });

        btnFinalizarTabulacao.setText("Salvar e finalizar esta tabulação");
        btnFinalizarTabulacao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnFinalizarTabulacaoActionPerformed(evt);
            }
        });

        tblPrecosColetados.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Preços", "Valor da caixa (R$)", "Valor da unidade (R$)"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tblPrecosColetados.setSelectionBackground(java.awt.Color.lightGray);
        tblPrecosColetados.setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        tblPrecosColetados.getTableHeader().setReorderingAllowed(false);
        scrollTabela.setViewportView(tblPrecosColetados);
        tblPrecosColetados.getColumnModel().getColumn(0).setResizable(false);
        tblPrecosColetados.getColumnModel().getColumn(1).setResizable(false);
        tblPrecosColetados.getColumnModel().getColumn(2).setResizable(false);

        lblAjudaTabela.setFont(new java.awt.Font("Ubuntu", 2, 15));
        lblAjudaTabela.setText("Para excluir, selecione uma linha e clique no botão 'Excluir linha', abaixo da tabela.");

        btnTabularProxSemana.setText("Tabular a próxima semana");
        btnTabularProxSemana.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnTabularProxSemanaActionPerformed(evt);
            }
        });

        btnTabularOutroProd.setText("Tabular outro produto");
        btnTabularOutroProd.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnTabularOutroProdActionPerformed(evt);
            }
        });

        btnDescartarTabulacao.setText("Descartar esta tabulação");
        btnDescartarTabulacao.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnDescartarTabulacaoActionPerformed(evt);
            }
        });

        lblResultadosUni.setFont(new java.awt.Font("Tahoma", 1, 14));
        lblResultadosUni.setText("Resultados por unidade (R$)");

        lblPrecoMinUni.setText("Preço Mínimo:");

        lblPrecoMaxUni.setText("Preço Máximo:");

        lblMediaUni.setText("Média: ");

        lblModaUni.setText("Moda:");

        lblMedianaUni.setText("Mediana:");

        lblEntreposto.setText("Entreposto:");

        lblModaCaixa.setText("Moda:");

        lblMedianaCaixa.setText("Mediana:");

        lblResultadosCaixa.setFont(new java.awt.Font("Tahoma", 1, 14));
        lblResultadosCaixa.setText("Resultados por caixa (R$)");

        lblPrecoMinCaixa.setText("Preço Mínimo:");

        lblMediaCaixa.setText("Média: ");

        lblPrecoMaxCaixa.setText("Preço Máximo:");

        btnVoltarTelaInicial.setText("Voltar à tela inicial");
        btnVoltarTelaInicial.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnVoltarTelaInicialActionPerformed(evt);
            }
        });

        btnExcluirLinha.setText("Excluir linha");
        btnExcluirLinha.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExcluirLinhaActionPerformed(evt);
            }
        });

        lblErroSemLSelec.setForeground(java.awt.Color.red);
        lblErroSemLSelec.setText("Mensagem de erro caso não haja linha selecionada");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(lblStatusTabulacao)
                        .addComponent(lblTitulo)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(btnTabularProxSemana)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(btnTabularOutroProd)
                            .addGap(18, 18, 18)
                            .addComponent(btnVoltarTelaInicial))
                        .addComponent(lblEntreposto)
                        .addComponent(lblClassificacao)
                        .addComponent(lblTipoCaixa)
                        .addComponent(lblResponsavelColeta)
                        .addComponent(lblAjudaTabela)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(lblModaCaixa)
                                    .addComponent(lblMediaCaixa)
                                    .addComponent(lblPrecoMaxCaixa)
                                    .addComponent(lblPrecoMinCaixa)
                                    .addComponent(lblResultadosCaixa)
                                    .addComponent(lblMedianaCaixa))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 151, Short.MAX_VALUE)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(lblPrecoMinUni)
                                    .addComponent(lblPrecoMaxUni)
                                    .addComponent(lblMediaUni)
                                    .addComponent(lblModaUni)
                                    .addComponent(lblMedianaUni)
                                    .addComponent(lblResultadosUni)))
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                .addComponent(scrollTabela, javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                    .addComponent(btnAdicionarPrecos)
                                    .addGap(18, 18, 18)
                                    .addComponent(btnFinalizarTabulacao)
                                    .addGap(18, 18, 18)
                                    .addComponent(btnDescartarTabulacao)))))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(btnExcluirLinha)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblErroSemLSelec)))
                .addContainerGap(658, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(lblStatusTabulacao)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnTabularProxSemana)
                    .addComponent(btnTabularOutroProd)
                    .addComponent(btnVoltarTelaInicial))
                .addGap(18, 18, 18)
                .addComponent(lblTitulo)
                .addGap(18, 18, 18)
                .addComponent(lblEntreposto)
                .addGap(18, 18, 18)
                .addComponent(lblClassificacao)
                .addGap(18, 18, 18)
                .addComponent(lblTipoCaixa)
                .addGap(18, 18, 18)
                .addComponent(lblResponsavelColeta)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnAdicionarPrecos)
                    .addComponent(btnFinalizarTabulacao)
                    .addComponent(btnDescartarTabulacao))
                .addGap(18, 18, 18)
                .addComponent(lblAjudaTabela)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(scrollTabela, javax.swing.GroupLayout.PREFERRED_SIZE, 171, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnExcluirLinha)
                    .addComponent(lblErroSemLSelec))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(lblResultadosCaixa)
                        .addGap(18, 18, 18)
                        .addComponent(lblPrecoMinCaixa)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblPrecoMaxCaixa)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblMediaCaixa)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblModaCaixa)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblMedianaCaixa))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(lblResultadosUni)
                        .addGap(18, 18, 18)
                        .addComponent(lblPrecoMinUni)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblPrecoMaxUni)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblMediaUni)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblModaUni)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblMedianaUni)))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void btnDescartarTabulacaoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDescartarTabulacaoActionPerformed

        int confirmacao;
        confirmacao = JOptionPane.showConfirmDialog(this, "Você tem certeza que deseja fechar a janela " +
                "'" + this.lblTitulo.getText() + "'? Essa operação é irreversível e acarretará a perda dos dados " +
                "da tabulação atual.", "Fechar " + "'" + this.lblTitulo.getText() + "'?",
                JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);

        if (confirmacao == JOptionPane.OK_OPTION)
        {
            this.tabPai.remove(this);
        }
    }//GEN-LAST:event_btnDescartarTabulacaoActionPerformed

    private void btnAdicionarPrecosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAdicionarPrecosActionPerformed

        DialogAdicionaPreco dialogAdiPrecos = new DialogAdicionaPreco(null, true, this);

        dialogAdiPrecos.setLocationRelativeTo(null); // centraliza o dialog na tela
        dialogAdiPrecos.setVisible(true);
    }//GEN-LAST:event_btnAdicionarPrecosActionPerformed

    private void btnExcluirLinhaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExcluirLinhaActionPerformed

        int indLinhaSelec = this.tblPrecosColetados.getSelectedRow();

        if (indLinhaSelec != -1)
        {
            // há uma linha selecionada
            DefaultTableModel modeloTblPrecos = (DefaultTableModel)this.tblPrecosColetados.getModel();
            modeloTblPrecos.removeRow(indLinhaSelec);

            this.reordenarPrecos(indLinhaSelec);

            this.lblErroSemLSelec.setVisible(false);
            this.assumirEstadoPosPreco();
        }
        else
        {
            // não há linhas selecionadas
            this.lblErroSemLSelec.setText("Selecione uma linha para excluir.");
            this.lblErroSemLSelec.setVisible(true);
        }
    }//GEN-LAST:event_btnExcluirLinhaActionPerformed

    private void btnFinalizarTabulacaoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnFinalizarTabulacaoActionPerformed

        DefaultTableModel modeloTblPrecos = (DefaultTableModel)this.tblPrecosColetados.getModel();

        int indFinal = this.tblPrecosColetados.getRowCount() - 1;

        for (int i = 0; i <= indFinal; i++)
        {
            float precoCaixa = Float.parseFloat(modeloTblPrecos.getValueAt(i, 1).toString().replace(',', '.'));
            float precoUnidade = Float.parseFloat(modeloTblPrecos.getValueAt(i, 2).toString().replace(',', '.'));

            this.tabulacao.adicionarPrecoCaixa(precoCaixa);
            this.tabulacao.adicionarPrecoUnidade(precoUnidade);
        }

        this.tabulacao.calcularEstatisticas();

        TabulacaoDAO tabulDAO = new TabulacaoDAO();
        try
        {
            tabulDAO.gravarTabulacao(tabulacao);
            
        } catch(Exception e)
        {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }

        this.assumirEstadoFinal();
    }//GEN-LAST:event_btnFinalizarTabulacaoActionPerformed

    private void btnTabularProxSemanaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnTabularProxSemanaActionPerformed

        ConfigNovaTabul novaConfig = new ConfigNovaTabul();
        novaConfig = this.configTabul;

        GregorianCalendar novaData = new GregorianCalendar();
        novaData.setTime(novaConfig.getDataColeta());
        novaData.add(Calendar.DAY_OF_MONTH, 7);
        novaConfig.setDataColeta(novaData.getTime());

        Tabulacao novaTabulacao = new Tabulacao(novaConfig);

        PanelNovaTabulacao panelTabulProxSem = new PanelNovaTabulacao(novaConfig, this.tabPai);

         // adiciona-se uma janela do tipo PanelNovaTabulacao; a janela atual é fechada
        SimpleDateFormat formatData = new SimpleDateFormat("dd/MM/yyyy");
        this.tabPai.addTab(novaConfig.getNomeProd() + " - " + formatData.format(novaConfig.getDataColeta()),
                panelTabulProxSem);
        this.tabPai.remove(this);
    }//GEN-LAST:event_btnTabularProxSemanaActionPerformed

    private void btnTabularOutroProdActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnTabularOutroProdActionPerformed

        this.tabPai.addTab("Configuração de Nova Tabulação", new PanelConfigNovaTabul(this.tabPai));
        this.tabPai.remove(this);
    }//GEN-LAST:event_btnTabularOutroProdActionPerformed

    private void btnVoltarTelaInicialActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnVoltarTelaInicialActionPerformed

        this.tabPai.remove(this);
    }//GEN-LAST:event_btnVoltarTelaInicialActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAdicionarPrecos;
    private javax.swing.JButton btnDescartarTabulacao;
    private javax.swing.JButton btnExcluirLinha;
    private javax.swing.JButton btnFinalizarTabulacao;
    private javax.swing.JButton btnTabularOutroProd;
    private javax.swing.JButton btnTabularProxSemana;
    private javax.swing.JButton btnVoltarTelaInicial;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    private javax.swing.JLabel lblAjudaTabela;
    private javax.swing.JLabel lblClassificacao;
    private javax.swing.JLabel lblEntreposto;
    private javax.swing.JLabel lblErroSemLSelec;
    private javax.swing.JLabel lblMediaCaixa;
    private javax.swing.JLabel lblMediaUni;
    private javax.swing.JLabel lblMedianaCaixa;
    private javax.swing.JLabel lblMedianaUni;
    private javax.swing.JLabel lblModaCaixa;
    private javax.swing.JLabel lblModaUni;
    private javax.swing.JLabel lblPrecoMaxCaixa;
    private javax.swing.JLabel lblPrecoMaxUni;
    private javax.swing.JLabel lblPrecoMinCaixa;
    private javax.swing.JLabel lblPrecoMinUni;
    private javax.swing.JLabel lblResponsavelColeta;
    private javax.swing.JLabel lblResultadosCaixa;
    private javax.swing.JLabel lblResultadosUni;
    private javax.swing.JLabel lblStatusTabulacao;
    private javax.swing.JLabel lblTipoCaixa;
    private javax.swing.JLabel lblTitulo;
    private javax.swing.JScrollPane scrollTabela;
    private javax.swing.JTable tblPrecosColetados;
    // End of variables declaration//GEN-END:variables

    /**
     * Configura corretamente o nome das colunas da tabela,
     * de acordo com a métrica da tabulação atual.
     */
    private void configurarCabecalho()
    {
        // definindo o título para a terceira coluna
        String titColuna3;
        String metrica = this.configTabul.getMetricaCaixa();

        if (metrica.equals("kg"))
        {
            titColuna3 = "Valor do kg (R$)";
        }
        else
        {
            titColuna3 = "Valor da unidade (R$)";
        }

        JTableHeader cabecalhoAtual = this.tblPrecosColetados.getTableHeader();
        TableColumnModel colunasAtual = cabecalhoAtual.getColumnModel();
        TableColumn coluna3 = colunasAtual.getColumn(2); // a terceira coluna tem índice 2

        colunasAtual.removeColumn(coluna3);

        coluna3.setHeaderValue(titColuna3);

        // adicionando a nova coluna à tabela de preços coletados
        colunasAtual.addColumn(coluna3);
        cabecalhoAtual.setColumnModel(colunasAtual);
        this.tblPrecosColetados.setTableHeader(cabecalhoAtual);
    }

    /**
     * Define quais componenentes deste painel devem estar visíveis / ativados.
     * Estado inicial é aquele que o painel tem logo quando foi aberto.
     */
    private void assumirEstadoInicial()
    {
        this.btnTabularProxSemana.setEnabled(false);
        this.btnTabularOutroProd.setEnabled(false);
        this.btnVoltarTelaInicial.setEnabled(false);

        this.btnFinalizarTabulacao.setEnabled(false);
        this.btnExcluirLinha.setEnabled(false);

        this.lblErroSemLSelec.setVisible(false);

        this.lblResultadosUni.setVisible(false);
        this.lblPrecoMinUni.setVisible(false);
        this.lblPrecoMaxUni.setVisible(false);
        this.lblMediaUni.setVisible(false);
        this.lblModaUni.setVisible(false);
        this.lblMedianaUni.setVisible(false);

        this.lblResultadosCaixa.setVisible(false);
        this.lblPrecoMinCaixa.setVisible(false);
        this.lblPrecoMaxCaixa.setVisible(false);
        this.lblMediaCaixa.setVisible(false);
        this.lblModaCaixa.setVisible(false);
        this.lblMedianaCaixa.setVisible(false);
    }

    /**
     * Define quais componenentes deste painel devem estar visíveis / ativados.
     * Estado pos preço é aquele que o painel tem logo depois do diálogo de adição de novos preços ser fechado
     * (ou do botão excluir ser pressionado).
     */
    public void assumirEstadoPosPreco()
    {
        // se foi adicionado algum preço à tabela, é possível finalizar a tabulação
        // e, também, excluir linhas
        int qtdeLinhasTblPrecos = this.tblPrecosColetados.getModel().getRowCount();

        if (qtdeLinhasTblPrecos >= 3)
        {
            this.btnExcluirLinha.setEnabled(true);
            this.btnFinalizarTabulacao.setEnabled(true);
        }
        else if (qtdeLinhasTblPrecos > 0)
        {
            this.btnExcluirLinha.setEnabled(true);
            this.btnFinalizarTabulacao.setEnabled(false);
        }
        else
        {
            this.btnExcluirLinha.setEnabled(false);
            this.btnFinalizarTabulacao.setEnabled(false);
        }
    }

    /**
     * Define quais componenentes deste painel devem estar visíveis / ativados.
     * Estado final é aquele assumido quando a tabulação já foi encerrada e salva.
     */
    private void assumirEstadoFinal()
    {
        this.lblStatusTabulacao.setText("Esta tabulação está salva e finalizada.");
        this.lblStatusTabulacao.setForeground(new Color(00, 99, 00));
        
        this.btnTabularProxSemana.setEnabled(true);
        this.btnTabularOutroProd.setEnabled(true);
        this.btnVoltarTelaInicial.setEnabled(true);
        
        this.btnAdicionarPrecos.setEnabled(false);
        this.btnFinalizarTabulacao.setEnabled(false);
        this.btnDescartarTabulacao.setEnabled(false);
        
        this.tblPrecosColetados.setEnabled(false);
        this.btnExcluirLinha.setEnabled(false);
        this.lblErroSemLSelec.setVisible(false);

        DecimalFormat decFormat = new DecimalFormat("00.00");

        this.lblPrecoMinCaixa.setText("Preço mínimo " + decFormat.format(this.tabulacao.getPrecoMinCaixa()));
        this.lblPrecoMaxCaixa.setText("Preço máximo: " + decFormat.format(this.tabulacao.getPrecoMaxCaixa()));
        this.lblMediaCaixa.setText("Média: " + decFormat.format(this.tabulacao.getMediaCaixa()));
        this.lblMedianaCaixa.setText("Mediana: " + decFormat.format(this.tabulacao.getMedianaCaixa()));

        this.lblPrecoMinUni.setText("Preço mínimo " + decFormat.format(this.tabulacao.getPrecoMinUnidade()));
        this.lblPrecoMaxUni.setText("Preço máximo: " + decFormat.format(this.tabulacao.getPrecoMaxUnidade()));
        this.lblMediaUni.setText("Média: " + decFormat.format(this.tabulacao.getMediaUnidade()));
        this.lblMedianaUni.setText("Mediana: " + decFormat.format(this.tabulacao.getMedianaUnidade()));

        if (this.tabulacao.getModaCaixa() == EstatisticasTabul.amodal)
        {
            this.lblModaCaixa.setText("Moda: amodal");
            this.lblModaUni.setText("Moda: amodal");
        }
        else
        {
            this.lblModaCaixa.setText("Moda: " + decFormat.format(this.tabulacao.getModaCaixa()));
            this.lblModaUni.setText("Moda: " + decFormat.format(this.tabulacao.getModaUnidade()));
        }

        this.lblResultadosCaixa.setVisible(true);
        this.lblPrecoMinCaixa.setVisible(true);
        this.lblPrecoMaxCaixa.setVisible(true);
        this.lblMediaCaixa.setVisible(true);
        this.lblModaCaixa.setVisible(true);
        this.lblMedianaCaixa.setVisible(true);
        
        this.lblResultadosUni.setVisible(true);
        this.lblPrecoMinUni.setVisible(true);
        this.lblPrecoMaxUni.setVisible(true);
        this.lblMediaUni.setVisible(true);
        this.lblModaUni.setVisible(true);
        this.lblMedianaUni.setVisible(true);
    }

    /**
     * Reordena a tabela de preços (se necessário) após a exclusão de uma linha.
     * @param indLinhaExcluida Índice da linha que foi excluída.
     */
    private void reordenarPrecos(int indLinhaExcluida)
    {
        DefaultTableModel modeloTblPrecos = (DefaultTableModel)this.tblPrecosColetados.getModel();

        int indInicial = indLinhaExcluida;
        int indFinal = modeloTblPrecos.getRowCount() - 1;
        int qtdeLinhas = modeloTblPrecos.getRowCount();

        // atualizamos o "nome" de todos os preços que vem após a linha excluída (caso ainda haja alguma
        // linha na tabela)
        while (indInicial <= indFinal && qtdeLinhas > 0)
        {
            modeloTblPrecos.setValueAt("Preço " + (indInicial + 1), indInicial, 0);
            indInicial++;
        }
    }

    public Tabulacao getTabulacao()
    {
        return tabulacao;
    }

    public JTable getTblPrecosColetados()
    {
        return tblPrecosColetados;
    }
}
